package automata;
//import ioAdmin.ArchivoSalida;
import ioAdmin.ArchivoSalida;
import ioAdmin.ExpresionRegular;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;

import automata.conversion.ConversionAF;
import automata.conversion.ConversionERaAFN;
import automata.modelo.Automata;
import automata.modelo.Transicion;


public class Main {
	public static String archivo_AFN, archivo_AFD;
	
	public static void main(String[] args)
	{
		String regex = "";
	if(args.length < 3)
		{
			System.out.println("Faltan argumentos!!! ejecute: java Main <expresion-regular> <archivo_AFN> <archivo_AFD>");
			System.out.println("EJEMPLO:  java Main a|((a|b)-c)*-d+ automata_afn.txt automata_afd.txt");
			System.exit(1);
		}else
		{
			regex = args[0];
			archivo_AFN = args[1];
			archivo_AFD = args[2];
		}
	   
		
//		regex="a-b*|(c|d)+-a*";
//		archivo_AFN="AFN.txt";
//		archivo_AFD="AFD.txt";
		
		/********* Conversion infija a posfija *****************/
		System.out.println("1---Conversion expresion a Posfija");
		System.out.println("Expresion regular->  " + regex);
	    ExpresionRegular er = new ExpresionRegular(regex);
	    ArrayList<Character> posfija = er.InfijoAPosfijo();
	    System.out.println("Posfija->  " + posfija.toString()); 
	    ArrayList<Character> alfabeto = er.ObtenerAlfabeto();
	    System.out.println("Alfabeto->  " + alfabeto.toString()); 
	    
	    String aux="";
	    
	    Iterator it;
	    
	    it=posfija.iterator(); // convierte el array posfina en un string, ya que el conversor de ER a AFN espera un string
	    while(it.hasNext()){
	    	aux+=((Character)it.next()).toString();	
	    }
	    
	    /******** Posfija a AF  ************/
	    System.out.println("2---Conversion posfija a AFN");
	    Automata afn = new Automata();
	    ConversionERaAFN convAfn = new ConversionERaAFN(aux);
	    afn = convAfn.getAutomataAFD();
	    System.out.println("Estado inicial" + afn.getEstadoInicial());
	    
	    /******** AFN ---> AFD *********/
	    System.out.println("3---Conversion AFN a AFD");
	    Automata afd = new Automata();
	    System.out.println("Simbolos en MAIN:" + afn.getSimbolos());
	    ConversionAF afdToAfd = new ConversionAF(afn);
	    afd = afdToAfd.convertir();
	    
	    System.out.println(afd.getEstadoInicial());
	    System.out.println(afd.getEstadosFinales());
	    System.out.println(afd.getSimbolos());
	    for(Transicion t : afd.getTransiciones())
	    	System.out.println(t.getDesde()+"----------"+ t.getSimbolo() +"-----------"+ t.getHasta());
	    System.out.println(afd.getEstadosFinales());
	    
	    /******* AFD ---> Archivo ***********/
	    System.out.println("4---Escribir a archivo");
	    System.out.println("Archivo afn");
	    ArchivoSalida.CrearArchivoTexto(afn, archivo_AFN);
	    System.out.println("Archivo afd");
	    ArchivoSalida.CrearArchivoTexto(afd, archivo_AFD);
	    ArchivoSalida.CrearArchivoJFLAP(afn, "afn");
	    ArchivoSalida.CrearArchivoJFLAP(afd, "afd");
	    
	    /******* JFLAP **********************/	    
	    	    
	}

}
